$OpenBSD: shmpatch-screen_c,v 1.1 2003/11/22 00:56:58 espie Exp $
--- screen.c.orig	2003-09-08 16:26:41.000000000 +0200
+++ screen.c	2003-11-17 23:37:54.000000000 +0100
@@ -71,6 +71,14 @@
 #if (defined(AUX) || defined(_AUX_SOURCE)) && defined(POSIX)
 # include <compat.h>
 #endif
+
+#ifdef IPC_EXPORT_IMAGE
+# include <sys/ipc.h>
+# include <sys/shm.h>
+#endif
+
+
+
 #if defined(USE_LOCALE) || defined(ENCODINGS)
 # include <locale.h>
 #endif
@@ -78,6 +86,11 @@
 # include <langinfo.h>
 #endif
 
+#ifdef IPC_EXPORT_IMAGE
+# include <sys/ipc.h>
+# include <sys/shm.h>
+#endif
+
 #include "screen.h"
 #ifdef HAVE_BRAILLE
 # include "braille.h"
@@ -234,6 +247,12 @@ struct win *console_window;
 
 
 
+
+#ifdef IPC_EXPORT_IMAGE
+char *shm;              /* pointer to shared memory segment */
+#endif
+
+
 /*
  * Do this last
  */
@@ -461,6 +480,37 @@ char **av;
   zmodem_recvcmd = SaveStr("!!! rz -vv -b -E");
 #endif
 
+#ifdef IPC_EXPORT_IMAGE
+  {
+    key_t key = 0xBACD072F;     /* random static IPC key */
+    int shmid;
+
+    /* Allocation of shared mem for 18000 bytes (screen text and attributes
+     * + few coord.).  We supose no screen will be wider than 132x66.
+     * 0x1C0 = [rwx------].
+     */
+    shmid = shmget( key, 18000, IPC_CREAT | 0x1C0 );
+    if( shmid < 0 )
+      {
+        Panic( errno, "shmget" );
+        /* NOTRECHED */
+      }
+    shm = shmat( shmid, 0, 0);
+    if ( shm == (void*)-1 )
+      {
+        Panic( errno, "shmat" );
+        /* NOTRECHED */
+      }
+    /* minimal initialisation just to have valid data */
+    shm[0] = 80;   /* scrdim x */
+    shm[1] = 1;    /* scrdim y */
+    shm[2] = 0;    /* csrpos x */
+    shm[3] = 0;    /* csrpos y */
+    strcpy( shm+4, "screen is initializing..." );
+    memset( shm+4+strlen(shm+4), ' ', 80);
+  }
+#endif
+
 #ifdef COPY_PASTE
   CompileKeys((char *)0, 0, mark_key_tab);
 #endif
